package com.guit.hrms.mapper;

import com.guit.hrms.dto.RoleDTO;
import com.guit.hrms.po.Permission;
import com.guit.hrms.po.Role;
import com.guit.hrms.vo.api.ApiVO;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface RoleMapper {
    /**
     * 查询所有角色
     * @return 角色列表
     */
    @Select("select * from roles")
    List<Role> queryRoles();

    /**
     * 根据角色id查询权限
     * @param id 角色id
     * @return 权限列表
     */
    @Select("select * from permissions where id in (select permission_id from role_permissions where role_id=#{id})")
    List<Permission> queryPermissionByRoleId(Integer id);

    /**
     * 查询所有权限
     * @return 权限列表
     */
    @Select("select * from permissions")
    List<Permission> queryPermissions();

    /**
     * 根据角色名查询角色
     * @param name 角色名
     * @return 角色id
     */
    @Select("select * from roles where name=#{name}")
    Role getRoleByName(String name);

    /**
     * 根据角色id查询角色
     * @param id 角色id
     * @return 角色
     */
    @Select("select * from roles where id=#{id}")
    Role getRoleById(Integer id);

    /**
     * 添加角色
     * @param roleDTO 角色信息
     * @return 添加结果
     */
    @Options(useGeneratedKeys = true,keyProperty = "id")
    @Insert("insert into roles(name,description,is_system) values(#{name},#{description},0)")
    Integer addRole(RoleDTO roleDTO);

    /**
     * 添加角色权限
     * @param roleId 角色id
     * @param permission 权限id
     * @return 添加结果
     */
    @Insert("insert into role_permissions(role_id,permission_id) values(#{roleId},#{permission})")
    Integer addRolePermission(Integer roleId, Integer permission);

    /**
     * 查询角色权限id
     * @param id 角色id
     * @param permission 权限id
     * @return 查询结果
     */
    @Select("select id from role_permissions where role_id=#{id} and permission_id=#{permission}")
    Integer getRolePermission(Integer id, Integer permission);

    /**
     * 更新角色权限
     * @param row 角色权限id
     * @param id 角色id
     * @param permission 权限id
     * @return 更新结果
     */
    @Update("update role_permissions set role_id=#{id}, permission_id=#{permission} where id=#{row}")
    Integer updateRolePermission(Integer row, Integer id, Integer permission);

    /**
     * 更新角色
     * @param roleDTO 角色信息
     * @return 更新结果
     */
    Integer updateRole(RoleDTO roleDTO);

    /**
     * 删除角色
     * @param roleIds 角色id列表
     * @return 删除结果
     */
    Integer deleteRole(List<Integer> roleIds);

    /**
     * 删除角色权限
     * @param roleIds 角色id列表
     * @return 删除结果
     */
    Integer deleteRolePermission(List<Integer> roleIds);

    /**
     * 查询角色拥有的权限数
     * @param id 角色id
     * @return 拥有权限数
     */
    @Select("select count(*) from role_permissions where role_id=#{id}")
    Integer getPermissionsByRole(Integer id);

    /**
     * 根据roleId查询apis
     * @param id
     * @return
     */
    @Select("select * from apis a, role_apis ra where a.id =ra.api_id and ra.role_id = #{roleId}")
    List<ApiVO> queryApiByRoleId(Integer id);

    /**
     * 查询全部apis
     * @return
     */
    @Select("select * from apis a, role_apis ra where a.id =ra.api_id")
    List<ApiVO> queryAllApi();

    /**
     * 添加后端接口权限
     * @param id
     * @param api
     * @return
     */
    @Insert("insert into role_apis(role_id , api_id) values (#{id},#{api}) ")
    Integer addRoleApi(Integer id, Integer api);

    /**
     * 查询角色拥有的api权限数
     * @param id 角色id
     * @return 拥有权限数
     */
    @Select("select count(*) from role_apis where role_id=#{id}")
    Integer getApisByRole(Integer id);

    Integer deleteRoleApi(List<Integer> id);

    /**
     * 查询角色权限id
     * @param id 角色id
     * @param api api的id
     * @return 查询结果
     */
    @Select("select id from role_apis where role_id=#{id} and api_id=#{api}")
    Integer getRoleApi(Integer id, Integer api);

    /**
     * 更新角色权限
     * @param row 角色权限id
     * @param id 角色id
     * @param api 权限id
     * @return 更新结果
     */
    @Update("update role_apis set role_id=#{id}, api_id=#{api} where id=#{row}")
    Integer updateRoleApi(Integer row, Integer id, Integer api);
}
